Micron Document




Libfixmath
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
libfixmath is a platform-independent fixed-point math library aimed at developers wanting to perform fast non-integer math on platforms lacking a (or with a low performance) FPU. It offers developers a similar interface to the standard math.h functions for use on Q16.16 fixed-point numbers. libfixmath has no external dependencies other than stdint.h and a compiler which supports 64-bit integer arithmetic (such as GCC).cite-ref-1[1] Conditional compilation options exist to remove the requirement for a 64-bit capable compiler as many compilers for microcontrollers and DSPs do not support 64-bit arithmetic.cite-ref-2[2]

Contents


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

History

libfixmath was developed by Ben Brewer and first released publicly as part of the Dingoo SDK.cite-ref-3[3] It has since been used to implement a software 3D graphics library called FGL.cite-ref-4[4]

Q16.16 functions

| Name | Description |
|---|---|
| fix16_acos | inverse cosine |
| fix16_asin | inverse sine |
| fix16_atan | one-parameter inverse tangent |
| fix16_atan2 | two-parameter inverse tangent |
| fix16_cos | cosine |
| fix16_exp | exponential function |
| fix16_sin | sine |
| fix16_sqrt | square root |
| fix16_tan | tangent |
| fix16_mul | multiplication |
| fix16_div | division |
| fix16_sadd | saturated addition |
| fix16_smul | saturated multiplication |
| fix16_sdiv | saturated division |

Other functions

| Name | Description |
|---|---|
| fix16_to_dbl | Convert Q16.16 to a double |
| fix16_to_float | Convert Q16.16 to a float |
| fix16_to_int | Convert Q16.16 to an integer |
| fix16_from_dbl | Convert double to a Q16.16 |
| fix16_from_float | Convert float to a Q16.16 |
| fix16_from_int | Convert integer to a Q16.16 |

Performance

For the most intensive function (atan2) benchmark results show the following results:

| Name | Time Compared to Float |
|---|---|
| ARM Cortex-M0 | 26.3% |
| Marvell PXA270 ( ARM ) @ 312 MHz | 58.45% |
| Intel T5500 | 120% |
| Intel Atom N280 | 141% |

Note: These results were calculated using fixtest with caching optimizations turned off.cite-ref-5[5]

Licensing

libfixmath is released under the MIT License, a permissive free software licence, and is free software.

See also
References

cite-note-11. "libfixmath Project Page". GitHub.
cite-note-22. "64-bit Compiler Support Issues".
cite-note-33. "Dingoo SDK Project Page".
cite-note-44. "FGL Flatmush/Fixed-Point Graphics Library Project Page".
cite-note-55. "fixtest Download Page".

External links

• Project Page
• Group Page/Mailing List